/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package is202.hrms.ejb;

import is202.hrms.ejb.AbstractFacade;
import is202.hrms.entity.Student;
import is202.hrms.entity.Modul;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * EJB tar hånd om databaseoperasjoner for Modul-objekter
 * @Stateless markerer bønnen som tilstandsløs. Stateless beans kan deles av flere brukere
 * See comments in StudentEJB
 * @author Vetle
 */
@Stateless
public class ModulEJB extends AbstractFacade<Modul> {
    
    /**
     * @PersistenceContext er en forespørsel til containeren (Catalina hos tomcat)
     * til å opprette eller finne en EntityManager og lagre det i en field "em".
     * Dette er en "dependency injection" som betyr at EntityManager-objekter
     * blir laget uten at vi trenger å skrive noe kode for å lage det.
     */
    @PersistenceContext(unitName = "slitdb")
    private EntityManager em;

    @EJB
    private StudentEJB studEJb;

    public ModulEJB() {
        super(Modul.class);
    }

    /**
     * Metode som er arvet fra AbstractFacade og gir tilgang til EntityManager
     */
    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    /** Modul har en relasjon til student og for å opprettholde denne relasjonen
     * har insert og update annotasjonen @Override.
     * Student har et en-til-mange-forhold til Modul.
     */
    @Override
    public Modul insert(Modul newMod) {
        Student stud = studEJb.find(newMod.getStudent().getStudentNr());
        newMod = super.insert(newMod);
        stud.getModuler().add(newMod);
        newMod.setStudent(stud);
        return newMod;
    }

    /**
     * Update is a bit more complex, because the old and new departments
     * must both be updated. In addition we need to get managed objects
     * to ensure that everything propagates to the database */
    @Override
    public Modul update(Modul editedMod) {
        Modul dbMod = find(editedMod.getId());
        if (null == dbMod) insert(editedMod);

        long newStudentNr = editedMod.getStudent().getStudentNr();
        Student newStud = studEJb.find(newStudentNr);
        Student oldStud = dbMod.getStudent();
        editedMod = super.update(editedMod);

        editedMod.setStudent(newStud);
        if (!newStud.equals(oldStud)) {
            oldStud.getModuler().remove(editedMod);
            newStud.getModuler().add(editedMod);
            editedMod.setStudent(newStud);
        }
        return editedMod;
    }

    @Override
    public void delete(Modul modul) {
        modul = em.merge(modul);
        Student stud = modul.getStudent();
        stud.getModuler().remove(modul);
        super.delete(modul);
    }
}
